#ifndef STATE_HPP
#define STATE_HPP

namespace smeg {
    namespace core {

struct MessageInfo;

////////////////////////////////////////////////////////////
// Abstract class to define an interface for a state
////////////////////////////////////////////////////////////
template < typename ENTITY >
class State
{
protected:
    ////////////////////////////////////////////////////////////
    /// Constructor/Destructor are protected because inherited state needs to be singleton
    ///
    ////////////////////////////////////////////////////////////
                    State()     {}
    virtual         ~State()    {}

public:
    ////////////////////////////////////////////////////////////
    /// Functions you need to create to handle when :
    /// - you enter a state
    /// - you update a state
    /// - you exit a state
    ///
    ////////////////////////////////////////////////////////////
    virtual void    OnEnter( ENTITY* _pEntity ) = 0;
    virtual void    OnUpdate( ENTITY* _pEntity ) = 0;
    virtual void    OnExit( ENTITY* _pEntity ) = 0;

    ////////////////////////////////////////////////////////////
    /// Function you need to create to handle messages
    ///
    ////////////////////////////////////////////////////////////
    virtual bool    HandleMessage( ENTITY* _pEntity, const MessageInfo& _msg ) { return false; }
};

    } // namespace core
} // namespace smeg

#endif // STATE_HPP